# 继承
# class A:
#     def __init__(self):
#         self.a = 1
#         self._b = 2
#         self.__c = 3
#
#     def show(self):
#         print("A是父类的方法")
#         print(f"公共属性a {self.a}")
#
# class B(A):
#
#     def __init__(self):  # 重写父类的构造方法
#         # 调用父类的构造方法
#         super().__init__()
#         self.d = 4
#
#     def display(self):
#         print("子类B的方法")
#
#     # 重写父类的方法
#     def show(self):
#         # 子类的方法直接调用父类的公共，保护属性。 （私有属性不能直接调用）
#         print({self.a}, {self._b})
#         # 直接调用父类的方法
#         super().show()
#         print("子类B重写的方法")
# # 获取子类的方法
# b1 = B()
# # 子类的实例调用子类的方法
# b1.display()
# # 子类的实例调用父类的方法
# b1.show()
# # 使用子类的实例调用父类的实例属性
# print(b1.a)
# print(b1.d)
# # 使用子类的实例调用父类的保护属性 (私有属性不能被调用)
# print(b1._b)

# 多继承
# class FA:
#     def __init__(self):
#         self.fa = 1
#
#     def show_1(self):
#         print("父类FA的方法")
#
#     def show(self):
#         print("父类 FA 的 show 方法")
#
# class FB:
#     def __init__(self):
#         self.fb = 2
#
#     def show_2(self):
#         print("父类FB的方法")
#
#     def show(self):
#         print("父类 FB 的 show 方法")
#
# class S(FA, FB):
#     def __init__(self):
#         FB.__init__(self)
#         FA.__init__(self)
#         self.s = 3
#
#     def s_show(self):
#         print("子类S的方法")
#
# s = S()
# s.show_1()  # 子类的实例调用父类FA的方法
# s.show_2()  # 子类的实例调用父类FB的方法
# s.s_show()  # 子类的实例调用子类的方法
# # 多个父类有相同名字的方法，按括号顺序
# s.show()
# print(s.fa)  # 通过子类的实例，调用多个父类中的实例属性
# print(s.fb)

# 多态
# 中医
# class Father:
#     def cure(self):
#         print("用中医方法进行治疗")
# # 西医
# class Son(Father):
#     def cure(self):  # 子类中重写父类的方法
#         print("用西医方法进行治疗")
# # 患者
# class Patient:
#     def needDoctor(self, doctor):
#         # 只用中医
#         if isinstance(doctor, Father):
#             doctor.cure()  # 通过医生的对象，调用治疗方法
#         else:
#             print("不用中医治疗")
#         # 需要医生的类型
#         if issubclass(doctor.__class__, Father):
#             doctor.cure()
#         else:
#             print("不是需要的医生")
# # 获取医生对象
# f_doctor = Father()
# s_doctor = Son()
# # 获取患者对象
# patient = Patient()
# patient.needDoctor(f_doctor)
# patient.needDoctor(s_doctor)
# patient.needDoctor(patient)
# # # 检查对象类型
# print(isinstance(f_doctor, Father))
# print(isinstance(f_doctor, Son))
# # 检查是否是某个类型的子类
# print(issubclass(Son, Father))
# print(issubclass(Father, Father))











